package br.com.vilababy.sigvb.mb.aluno;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.EstadoEnum;
import br.com.vilababy.sigvb.constantes.LogradouroEnum;
import br.com.vilababy.sigvb.constantes.RelacaoEnum;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.mb.AbstractAlunoMBean;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Contato;
import br.com.vilababy.sigvb.modelo.DocumentacaoPessoal;
import br.com.vilababy.sigvb.modelo.Endereco;
import br.com.vilababy.sigvb.modelo.Responsavel;
import br.com.vilababy.sigvb.repository.AlunoRepository;
import br.com.vilababy.sigvb.repository.ResponsavelRepository;

@ManagedBean
@ViewScoped
public class ResponsavelMBean extends AbstractAlunoMBean implements Serializable {

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	private static final long serialVersionUID = 1L;

	private Responsavel responsavel = new Responsavel();
	private Responsavel responsavelSelecionado = new Responsavel();
	private Contato contato = new Contato();
	private Endereco endereco = new Endereco();
	private LazyDataModel<Aluno> alunosResponsaveis = null;
	private Map<Aluno,List<Responsavel>> responsaveis = null;
	private String totalPaginas;
	private int inicio;
	
	public ResponsavelMBean() {
		setRepositoryResponsavel(new ResponsavelRepository());
		setRepositoryAluno(new AlunoRepository());
		setComboAlunos(getRepositoryAluno().listarTodos());
		inicializarObjetosResponsavel();
	}
	
	@PostConstruct
	private void carregarResponsaveisPaginacao() {
		alterarListaExibicao(((ResponsavelRepository) getRepositoryResponsavel()).listarParcial(this.inicio, 4));
		this.totalPaginas = !this.responsaveis.isEmpty() ? String.valueOf(((ResponsavelRepository) getRepositoryResponsavel()).totalResponsaveisFiltrados() / 4) : SIGVBEnum.VALOR_UM.getValor();
	}
	
	public LazyDataModel<Aluno> getAlunosResponsaveis() {
		return alunosResponsaveis;
	}

	public void setAlunosResponsaveis(LazyDataModel<Aluno> alunosResponsaveis) {
		this.alunosResponsaveis = alunosResponsaveis;
	}

	public final void setResponsavel(Responsavel responsavel) {
		this.responsavel = responsavel;
	}
	public final Responsavel getResponsavel() {
		return this.responsavel;
	}
	public Responsavel getResponsavelSelecionado() {
		return responsavelSelecionado;
	}
	public void setResponsavelSelecionado(Responsavel responsavelSelecionado) {
		this.responsavelSelecionado = responsavelSelecionado;
	}
	public final Contato getContato() {
		return contato;
	}
	public final void setContato(Contato contato) {
		this.contato = contato;
	}
	public final Endereco getEndereco() {
		return endereco;
	}
	public final void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	public Map<Aluno,List<Responsavel>> getResponsaveis() {
		return this.responsaveis;
	}
	public void setResponsaveis(Map<Aluno,List<Responsavel>> responsaveis) {
		this.responsaveis = responsaveis;
	}
	public String getTotalPaginas() {
		return totalPaginas;
	}

	public void setTotalPaginas(String totalPaginas) {
		this.totalPaginas = totalPaginas;
	}

	public String showCadastrarResponsavel() {
		return "responsavel.xhtml";/*PaginaEnum.CADASTRAR_RESPONSAVEL.getValor();*/
	}
	
	public List<String> consultarNomePai(String nome) {
		Responsavel pai = getResponsavel(RelacaoEnum.PAI, nome);
		return ((ResponsavelRepository) getRepositoryResponsavel()).consultarPorNome(pai);
	}
	
	public List<String> consultarNomeMae(String nome) {
		Responsavel mae = getResponsavel(RelacaoEnum.MAE, nome);
		return ((ResponsavelRepository) getRepositoryResponsavel()).consultarPorNome(mae);
	}
	
	public Responsavel getResponsavel(RelacaoEnum relacao, String nome) {
		Responsavel responsavel = new Responsavel();
		responsavel.setRelacao(relacao);
		responsavel.setNome(nome);
		return responsavel;
	}
	
	private void alterarListaExibicao(List<Responsavel> responsaveis) {
		this.responsaveis = new LinkedHashMap<Aluno, List<Responsavel>>(); 
		for (Responsavel responsavel : responsaveis) {
			if (this.responsaveis.containsKey(responsavel.getAluno()))
				this.responsaveis.get(responsavel.getAluno()).add(responsavel);
			else {
				List<Responsavel> lista = new ArrayList<Responsavel>();
				lista.add(responsavel);
				this.responsaveis.put(responsavel.getAluno(), lista);
			}
		}
	}
	
	public void exibirResponsavelSelecionado(SelectEvent evento) {
		this.responsavelSelecionado = getRepositoryResponsavel().get(((Responsavel)evento.getObject()).getId()); 
	}
	
	public void adicionarResponsavel(ActionEvent evento) {
		if (!consultarExistenciaPaiMae()) {
			setCampoNuloResponsavelInserir();
			removerMascaraCampos();
			getRepositoryResponsavel().inserir(this.responsavel);
			SIGVBUtil.adicionarMensagemSucesso(SIGVBUtil.getValorMensagem(SIGVBEnum.LABEL_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CADASTRO_RESPONSAVEL_SUCESSO.getValor()));
			carregarResponsaveisPaginacao();
			limparTela();
		}  
	}
	
	private void setCampoNuloResponsavelInserir() {
		if (this.responsavel.getEndereco().getLogradouro() == null)
			this.responsavel.setEndereco(null);
		
		if (this.responsavel.getDocumentacao().getCpf() == null || this.responsavel.getDocumentacao().getCpf().isEmpty())
			this.responsavel.setDocumentacao(null);
		
		if (this.responsavel.getContato().getTelefone1() == null || this.responsavel.getContato().getTelefone1().isEmpty() && 
				this.responsavel.getContato().getTelefone2() == null || this.responsavel.getContato().getTelefone2().isEmpty() && 
					this.responsavel.getContato().getTelefone3() == null || this.responsavel.getContato().getTelefone3().isEmpty())
			this.responsavel.setContato(null);
	}
	
	private boolean consultarExistenciaPaiMae() {
		if (this.responsavel.getRelacao().equals(RelacaoEnum.PAI)) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.PAI_EXISTENTE.getValor()));
			return ((ResponsavelRepository) getRepositoryResponsavel()).verificarExistenciaPai(this.responsavel.getAluno());
		} else if (this.responsavel.getRelacao().equals(RelacaoEnum.MAE)) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.MAE_EXISTENTE.getValor()));
			return ((ResponsavelRepository) getRepositoryResponsavel()).verificarExistenciaMae(this.responsavel.getAluno());
		}
		
		return false;
	}
	
	private void removerMascaraCampos() {
		if (this.responsavel.getDocumentacao() != null && this.responsavel.getDocumentacao().getCpf() != null && !this.responsavel.getDocumentacao().getCpf().isEmpty())
			this.responsavel.getDocumentacao().setCpf(SIGVBUtil.removerMascara(this.responsavel.getDocumentacao().getCpf()));
		
		if (this.responsavel.getContato() != null) {
			if (this.responsavel.getContato().getTelefone1() != null && !this.responsavel.getContato().getTelefone1().isEmpty())
				this.responsavel.getContato().setTelefone1(SIGVBUtil.removerMascara(this.responsavel.getContato().getTelefone1()));
			
			if (this.responsavel.getContato().getTelefone2() != null && !this.responsavel.getContato().getTelefone2().isEmpty())
				this.responsavel.getContato().setTelefone2(SIGVBUtil.removerMascara(this.responsavel.getContato().getTelefone2()));
			
			if (this.responsavel.getContato().getTelefone3() != null && !this.responsavel.getContato().getTelefone3().isEmpty())
				this.responsavel.getContato().setTelefone3(SIGVBUtil.removerMascara(this.responsavel.getContato().getTelefone3()));
		}
		
		if (this.responsavel.getEndereco() != null && this.responsavel.getEndereco().getCep() != null && !this.responsavel.getEndereco().getCep().isEmpty())
			this.responsavel.getEndereco().setCep(SIGVBUtil.removerMascara(this.responsavel.getEndereco().getCep()));
	}
	
	public void paginarResponsaveis(ActionEvent evento) {
		int pagina = Integer.parseInt(SIGVBUtil.getParametro(SIGVBEnum.PROXIMA_PAGINA.getValor()));
		this.inicio = (pagina * 4) - 4;
		carregarResponsaveisPaginacao();
	}
	
	public Responsavel getResponsavelFinanceiro(Long id) {
		Aluno aluno = new Aluno();
		aluno.setId(id);
		return ((ResponsavelRepository) getRepositoryResponsavel()).consultarResponsavelFinanceiro(aluno);
	}
	
	@Override
	protected void limparTela() {
		this.responsavel = new Responsavel();
		inicializarObjetosResponsavel();
	}
	
	private void inicializarObjetosResponsavel() {
		DocumentacaoPessoal documentacao = new DocumentacaoPessoal();
		this.responsavel.setDocumentacao(documentacao);
		Aluno aluno = new Aluno();
		this.responsavel.setAluno(aluno);
		Contato contato = new Contato();
		this.responsavel.setContato(contato);
		Endereco endereco = new Endereco();
		this.responsavel.setEndereco(endereco);
	}
}
